define [
  'chaplin'
  'lib/dao_factory'
  'daos/user_dao'
], (Chaplin, DaoFactory) ->

  'use strict'

  UserDao = null

  class Dispatcher extends Chaplin.Dispatcher

    # Additional Attributes
    # Rotas que não necessitam de verificação de sessão
    ROUTES_TO_NOT_CHECK: [
      'user#login'
      'user#novo'
      'site#index'
    ]

    # Controllers que possuem permissões de acesso
    CONTROLLER_ROLES_MAP =
      'user'        : ['ROLE_ADMINISTRADOR']

    # Override Methods
    # =============================================================

    initialize: ->
      super
      UserDao = DaoFactory.getDAOByName 'user_dao'

    dispatch: (route, params, options) ->
      # Verifica se a rota requisitada é uma das que não necessitam de verificação de sessão
      isNotVerifiable = @ROUTES_TO_NOT_CHECK.indexOf(route.name) >= 0
      if isNotVerifiable
        @backupGlobals()
        @publishEvent 'layout:updateMenu'
        super
        @trackPageview()
      else
        @_args = arguments
        promise = UserDao.verificarUsuarioLogado()

        # Logado
        promise.done (userData) =>
          @backupGlobals()
          window.AppData.CNTRL_GLOBALS.userData = userData
          @publishEvent 'layout:updateMenu', userData.authorities
          window.userAuthorities = userData.authorities
          Dispatcher.__super__.dispatch.apply _this, @_args
          @trackPageview()

        # Não logado
        # promise.fail => window.location.hash = '#login'

    # Additional Methods
    # =============================================================

    backupGlobals: ->
      return unless @currentController

      if _.isObject(@currentController.globals) and !_.isEmpty(@currentController.globals)
        _.extend window.AppData.CNTRL_GLOBALS, @currentController.globals

    trackPageview: ->
      url = Backbone.history.getFragment()
      url = "/" + url if !/^\//.test(url) && url != ''

      try
        ga 'send',
          hitType : 'pageview'
          page    : url
      catch error
